package com.jusha.formulacalculation.functions;

import com.jusha.formulacalculation.exception.NullFunctionException;
import com.jusha.formulacalculation.interfaces.IProcessFunction;

import java.util.*;

/**
 * 函数管理类
 * 常量定义为0参函数,通过函数体直接返回常量
 */
public class ManageFunctions {
    /**
     * 函数列表
     */
    private final static Map<String, PackFunction> functions = new Hashtable<>();

    static {
        LoadDefaultFunctions.load();
    }


    /**
     * 添加一个新常量
     *
     * @param name       常量名
     * @param function   常量体
     * @return
     */
    public static boolean add(String name, IProcessFunction function) {
        if (name == null || function == null)
            return false;
        if (functions.containsKey(name))
            return false;

        functions.put(name, new PackFunction(0, function));
        return true;
    }
    /**
     * 添加一个新函数
     *
     * @param name       函数名
     * @param paramCount 参数个数
     * @param function   函数体
     * @return
     */
    public static boolean add(String name, int paramCount, IProcessFunction function) {
        if (name == null || function == null)
            return false;
        if (functions.containsKey(name))
            return false;
        if (paramCount < 0) {
            return false;
        }

        functions.put(name, new PackFunction(paramCount, function));
        return true;

    }

    /**
     * 获取函数
     *
     * @param name
     * @return
     */
    public static PackFunction get(String name) throws NullFunctionException {
        if (!functions.containsKey(name))
            throw new NullFunctionException(name);
        return functions.get(name);
    }

    /**
     * 是否包含指定函数
     * @param name
     * @return
     */
    public static boolean has(String name){
        return functions.containsKey(name);
    }
    /**
     * 列出当前所有注册的函数
     *
     * @return
     */
    public static Set<String> listName() {
        return functions.keySet();
    }
}
